#ifndef SERVER_HPP
#define SERVER_HPP

#include "EventLoop.hpp"
#include "EventLoopThreadPool.hpp"
#include "Channel.hpp"
#include <memory>

// 定义了一个名为 Server 的类，它的作用是创建一个服务器，并在该服务器上监听指定的端口。

class Server {
public:
    Server(int thread_num, int port);
    void start_loop();
    void stop_loop(){isQuit_.store(true);};
private:
private:
    // int GetMinConnectionThread();
    // void AddConnection(int id, int threadId, std::shared_ptr<TcpConnection> conn);
    // void RemoveConnection(int id);

    // std::unordered_map<int, std::pair<int, std::shared_ptr<TcpConnection>>> m_Connections;   // fd -> <threadId, conn>
    // std::vector<int> m_EachThreadConnectionCount;                        // 每个线程负责的连接数
    // std::unique_ptr<Acceptor> m_Acceptor;
    // EventLoop m_EventLoop;

    // std::function<bool(std::shared_ptr<TcpConnection>, const InetAddress&)> m_NewConnectionCallback; // 自行在 callback 里开启听或读
    // std::function<void(std::shared_ptr<TcpConnection>)> m_CloseConnectionCallback;
    // InetAddress m_Address;
    // bool m_Running;

    // std::mutex m_Mutex;
    void handNewConn();
    void setListenFdNonBlock();
    
    int threadNum_;                             // 线程池线程数
    int port_;                                  // 监听端口
    bool started_;                              // 服务器启动标志
    bool isEventHandling_;                    // 事件处理标志
    std::atomic<bool> isLooping_;              // 服务器启动标志
    std::atomic<bool> isQuit_;                 // 退出标志 

    int listenFd_;                              // 监听套接字描述符
    std::shared_ptr<Channel> acceptChannel_;    // 接受连接的Channel
    std::shared_ptr<Poller> poller_;            // Poller对象
    std::shared_ptr<EventLoopThreadPool> eventLoopThreadPool_; // 事件循环线程池

    std::atomic<int> clientsServed_;               // 客户端数量

};

#endif // SERVER_HPP